package com.lzyyj.gmis.base.service;

import com.lzyyj.common.Page;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public interface IBaseService<T,PK extends Serializable> {

	/**
	 * 当前用户存储Key
	 */
	public final static String CURRENT_USER = "currentUser";  	// 当前用户Key
	
	public <T1, PK1 extends Serializable> IBaseService<T1, PK1> getBaseService(Class<T1> clazz1);

	/**
	 * 注入公共的系统服务
	 * @param systemService	系统服务
	 */
	public void setSystemService(ISystemService systemService);

	/**
	 * 获取公共的系统服务
	 */
	public ISystemService getSystemService();

	/**
	 * 获得功能模块标识
	 * @return  结果
	 */
	public String getModuleId();

	/**
	 * 获得功能模块名称
	 * @return  结果
	 */
	public String getModuleName();

	/**
	 * 获得持久化实体名列表
	 * @return  结果
	 */
	public List<Map<String, Object>> getEntityNameList();

	/**
	 * 获取管理的实体类
	 */
	public Class<T> getEntityClass();

	/**
	 * 获取公共的系统服务
	 *
	 * @param entity	实体对象
	 * @param propertyList 属性列表
	 * @return  结果
	 * @throws Exception 可能的异常
	 */
	public T get(T entity, String propertyList) throws Exception;

	/**
	 * 获取新建对象
	 * @return  结果
	 * @throws Exception 可能的异常 
	 */
	public T getNew() throws Exception;

	/**
	 * 获取新建对象（附参考对象）
	 * @param example	参考示例
	 * @return  结果
	 * @throws Exception 可能的异常 
	 */
	public T getNew(T example, String propertyList) throws Exception;

	/**
	 * 获得指定对象
	 * @param id 主键
	 * @return  结果
	 * @throws Exception 可能的异常 
	 */
	public T get(PK id) throws Exception;

	/**
	 * 获得指定对象
	 * @param entity 参考示例
	 * @return  结果
	 * @throws Exception 可能的异常 
	 */
	public T get(T entity) throws Exception;

	/**
	 * 删除指定对象
	 * @param id	主键
	 * @throws Exception 可能的异常
	 */
	@Transactional(propagation= Propagation.REQUIRED,readOnly=false)
	public void del(PK id) throws Exception;

	/**
	 * 批量删除对象
	 * @param ids 	主键列表
	 * @throws Exception 可能的异常
	 */
	@Transactional(propagation=Propagation.REQUIRED,readOnly=false)
	public void del(PK[] ids) throws Exception;

	/**
	 * 删除指定对象
	 * @param entity 示例
	 * @throws Exception 可能的异常
	 */
	@Transactional(propagation=Propagation.REQUIRED,readOnly=false)
	public void del(T entity) throws Exception;

	/**
	 * 获取用于修改的对象
	 * @param id	主键
	 * @return  结果
	 * @throws Exception 可能的异常 
	 */
	public T getForModify(PK id) throws Exception;

	/**
	 * 获取用于修改的对象
	 * @param entity	实体对象
	 * @return  结果
	 * @throws Exception 可能的异常 
	 */
	public T getForModify(T entity) throws Exception;

	/**
	 * 获取用于修改的对象
	 * @param entity	实体对象
	 * @param propertyList 属性列表
	 * @return  结果
	 * @throws Exception 可能的异常 
	 */
	public T getForModify(T entity, String propertyList) throws Exception;


	/**
	 * 保存对象
	 * @param entity 实体对象
	 * @return  结果
	 * @throws Exception 可能的异常
	 */
	@Transactional(propagation=Propagation.REQUIRED,readOnly=false)
	public T save(T entity) throws Exception;

	/**
	 * 保存对象
	 * @param entity 实体对象
	 * @return  结果
	 * @throws Exception 可能的异常
	 */
	@Transactional(propagation=Propagation.REQUIRED,readOnly=false)
	public T save(T entity, String propertyList) throws Exception;

	/**
	 * 更新对象的指定属性
	 * @param entity 实体对象
	 * @return  结果
	 * @throws Exception 可能的异常
	 */
	@Transactional(propagation=Propagation.REQUIRED,readOnly=false)
	public T update(T entity, String propertyList) throws Exception;

	/**
	 * 分页管理
	 * @param page
	 * @return  结果
	 * @throws Exception 可能的异常 
	 */
	public Page<T> manage(Page<T> page) throws Exception;

	/**
	 * 判断某实体对象的指定属性组合是否唯一
	 * @param instance
	 * @param propertyList 属性列表
	 * @return  结果
	 */
	public boolean isUnique(T instance, String propertyList);

	public List<T> findByExample(T entity, String propertyList, String orderBy, long... firstAndMaxResults) throws Exception;

	public List<T> getAll(String orderBy, long... firstAndMaxResults) throws Exception;

	/**
	 * 获得实体类属性列表
	 * @return  结果
	 * @throws Exception 可能的异常 
	 */
	public String getPropertyList() throws Exception;

	/**
	 * 
	 * @return  结果
	 */
	public String getIdName();
	
	/**
     * 获得指定对象在指定查询条件下的位置序号，0算起
     * @param focus	焦点实例
     * @param page	分页查询条件
     * @return  结果
     */
    public long getIndex(T focus, Page<T> page);

    /**
	 * 处理持久化对象的属性列表
     * @param entityPo 实体对象
     * @param propertyList 属性列表
     * @throws Exception 可能的异常
     */
	public Map<Class<?>, Map<Serializable, Object>> loadProperties(T entityPo, String propertyList, Map<Class<?>, Map<Serializable, Object>> propertyValueCache) throws Exception;

	/**
	 * 根据属性名和属性值查询对象.
	 * 
	 * @return 符合条件的对象列表
	 * @throws Exception 可能的异常
	 */
	public List<T> findByProperty(String propertyName, Object value, String orderBy, String propertyList, long... firstAndMaxResults) throws Exception;

}
